package base_init

import (
	"fmt"
	"go-likaladi-shop/common/base_config"
	"go-likaladi-shop/common/base_global"
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func DB(config base_config.MysqlConfig) {
	// 数据库连接字符串（DSN），格式为：用户名:密码@tcp(主机地址:端口)/数据库名?charset=utf8mb4&parseTime=True&loc=Local
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.User, config.Password, config.Host, config.Port, config.DB)
	base_global.DB = createDB(dsn)
	zap.S().Infof("数据库初始化")
}

/*
创建数据库连接，获取DB
*/
func createDB(dsn string) *gorm.DB {
	// 数据库连接字符串（DSN），格式为：用户名:密码@tcp(主机地址:端口)/数据库名?charset=utf8mb4&parseTime=True&loc=Local
	//dsn := "root:likaladi@tcp(192.168.2.171:3306)/lwshop_user?charset=utf8mb4&parseTime=True&loc=Local"

	// 配置自定义日志输出（newLogger），用于记录 GORM 的 SQL 执行日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // 设置日志输出到标准输出（终端），日志格式为标准日期格式
		logger.Config{
			SlowThreshold: time.Second, // 慢查询阈值，表示查询执行超过 1 秒视为慢查询
			LogLevel:      logger.Info, // 设置日志级别为 Info，表示记录信息级别的日志
			Colorful:      true,        // 设置日志输出为彩色
		})

	// 使用 GORM 打开 MySQL 数据库连接，`dsn` 为数据库连接字符串，`gorm.Config` 用于配置 GORM 行为
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		// 命名策略配置，决定表名是否使用复数形式
		NamingStrategy: schema.NamingStrategy{
			// 设置为 true 表示表名使用单数形式，而不是默认的复数形式
			SingularTable: true, // 启用单数表名策略
		},
		Logger: newLogger, // 将自定义的日志配置传递给 GORM
	})
	// 如果打开数据库连接失败，打印错误并终止程序
	if err != nil {
		//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
		zap.S().Fatalf("数据库连接失败: %v", err)
	}
	return db
}
